RDT?
Reliable Data Transfer 의 약자이다. 신뢰성 있는 데이터 전송을 위한 프로토콜의 일반적인 개념을 의미한다.
TCP?
전송 제어 프로토콜 (Transmission Control Protocol) 의 약자로, 인터넷 프로토콜 스택의 전송 계층에 있는 프로토콜이다. RDT 의 구체적인 구현이다.
재전송
패킷이 손실되거나 예상한 시간 내에 ACK 가 도착하지 않으면 패킷을 재전송한다.
- ACK 가 예상 시간 내에 도착하지 않을 때 TCP 는 데이터가 유실되었다고 판단하고 재전송을 시작한다.
- 패킷 손실이 감지되면, TCP 는 혼잡이 원인이라고 생각하고 윈도우 크기를 줄인다. 윈도우 크기가 너무 작아져서 모든 패킷에 대한 ACK 를 빠르게 받게 되면 TCP 는 윈도우 크기를 다시 증가시키면서 전송 속도를 높인다.
- ACK 가 너무 오래 도착하지 않으면 연결이 끊어진 것으로 간주하고 해당 세션에 대한 연결을 종료할 수 있다.
- 시퀀스 번호: 각 패킷은 고유한 시퀀스 번호를 갖는다. 이를 통해 수신자는 패킷의 순서를 알 수 있으며, 누락된 패킷이 있는지 알 수 있다.
- 타이머 설정: 송신자는 데이터 패킷을 보낼 때마다 재전송 타이머를 설정한다. 해당 타이머가 만료되기 전에 수신자로부터 해당 패킷의 ACK 를 받지 못하면, 패킷이 손실되었다고 판단하고 패킷을 재전송한다.
- ACK 확인: 수신자는 패킷을 받을 때마다 해당 패킷의 ACK 를 송신자에게 전송한다. 송신자는 해당 ACK 를 통해 패킷이 성공적으로 전달되었는지 확인한다.
- 재전송: 송신자는 ACK 를 받지 못한 패킷을 재전송한다. 네트워크 상의 패킷 손실, 지연 등 다양한 이유로 인해 필요할 수 있다.
- Exponential Backoff: 만약 패킷이 계속해서 손실되면, 송신자는 재전송 간격을 지수적으로 증가시켜 네트워크 혼잡을 줄이려 시도한다.
타임아웃 메커니즘
연결 설정을 시도하는 동안 네트워크 지연이나 다른 문제로 인해 응답이 없는 경우를 처리하기 위해 존재한다.
- SYN Retransmission
클라이언트가 처음 SYN 패킷을 보낸 후, 서버로부터 SYN-ACK 응답을 기다리게 된다. 만약 응답이 일정 시간 내에 도착하지 않으면 클라이언트는 SYN 패킷을 다시 전송할 수 있다. 재전송되는 SYN 패킷의 타임아웃은 지수적으로 증가하며, 특정 횟수까지만 시도된다. (Linux 에서는 기본적으로 5회의 SYN 재전송을 시도하고, 이로써 총 연결 대기 시간은 약 180초 정도이다.)
재전송 간격은 두 배로 증가하는 Exponential Backoff 를 사용한다.
- Connection Timeout
SYN 패킷의 재전송 횟수가 일정 횟수를 초과하고 클라이언트는 연결 시도를 중단하고 연결 실패로 간주한다. 이 때의 타임아웃을 연결 타임아웃이라 한다. 운영체제나 TCP 스택 설정에 따라 다를 수 있다. 일반적으로는 수 초 ~ 수 분 사이의 시간을 갖는다.
플래그
PSH
수신자의 TCP 스택은 버퍼링하지 않고 해당 패킷의 데이터를 즉시 애플리케이션 레벨로 전달해야 한다는 것을 나타낸다.
일반적으로 버퍼링된 데이터를 받는 쪽의 애플리케이션에 즉시 전달하고자 할 때 사용된다.
ACK
TCP 패킷이 확인 응답을 포함하고 있음을 나타낸다.
TCP 가 신뢰성 있는 데이터 전송 프로토콜이기 때문에, 데이터를 성공적으로 받았다는 것을 수신 측이 송신 측에 알려주는 확인응답 메커니즘이 필요하다.
ACK 플래그와 함께 전송되는 숫자는 다음에 기대하는 시퀀스 번호를 뜻한다.
모든 TCP 패킷에는 ACK 플래그가 설정되어야 한다.
RST
현재 연결을 즉시 종료하도록 지시한다.
연결이 예상치 않게 종료되어야 할 때 사용한다. 예시로, 서버가 클라이언트로부터 받은 데이터를 해당 포트에서 수신 대기하고 있지 않은 서비스로 전달하려고 시도하는 경우 RST 패킷을 반환할 수 있다.
서버나 클라이언트에서 더 이상 데이터 통신을 원하지 않을 때도 RST 패킷을 보낼 수 있다.